home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 626-637 / disk_629 / rexxrmf / rexxrmf.lzh / videorental.rexx < prev   
OS/2 REXX Batch file  |  1992-03-14  |  18KB  |  571 lines

  1. /* --------------------------------------------------------------- 
  2.  
  3.    Example illustrating use of 'linking' multiple files and indexes 
  4.  
  5.    This example 'links' three files together in an attempt to simulate
  6.    a 'relational' database for a fictious video rental store.
  7.  
  8.    File 1 - videofile    - 
  9.             contains all videos in the store
  10.             primary key is a 'videonumber' which can occur
  11.             multiple times because of multiple copies of the
  12.             same video.
  13.             alternate keys are videorating
  14.                                videocopynumber
  15.                                renting customer number
  16.                                hold for customer number
  17.  
  18.    File 2 - customerfile - 
  19.             contains names and addresses of registered 
  20.             video patrons.
  21.             primary key is a unique 'customernumber'
  22.             alternate keys are customerlastname
  23.                                customerbalance (if any)
  24.  
  25.    File 3 - rentalfile   - 
  26.             rental history of each video by customer
  27.             primary key is 'videonumber'
  28.             alternate keys are customernumber
  29.                                rentaldate
  30.                                videcopynumber
  31.  
  32.       I hope the relationship between the tree files is obvious.
  33.       The rentalfile links the videofile to the customer file. 
  34.  
  35.            
  36.  * --------------------------------------------------------------- */
  37.  
  38. /* ------------------- Record Layout Strings --------------------- */
  39.  
  40. customerrecord = " custnumber custfirst custlast custaddr custcity custstate,
  41.                    custzip custphone custareacode custdeposit custbalance"
  42.  
  43. videorecord    = " videonum videotitle videocopy videorating videopudate,
  44.                    videopuprice videosaleprice videoavail videohold videocust"
  45.  
  46. rentalrecord   = " rentalcustnumber rentalvideonum rentalvideocopy rentaldate"
  47.  
  48.  
  49. /* --- make library available --- */
  50.  
  51. x = addlib("RexxRMF.library",0,-30,0) 
  52.  
  53.  
  54.  
  55. if exists("videofile") = 1 then 
  56.    loadfile = 0
  57. else
  58.    loadfile = 1
  59.    
  60. /* will allow duplicate keys in primary index for videos */
  61. /* primary index is video number */
  62.  
  63. rmfvideos    = open_rmf("videofile")
  64. say "videofile " any_err(rmfvideos)
  65.  
  66. /* will NOT allow duplicate keys in primary index for customers */
  67. /* primary index is customer number */
  68.  
  69. rmfcustomers = open_rmf("customerfile",1)
  70. say "customersfile " any_err(rmfcustomers)
  71.  
  72.  
  73. /* will allow duplicates in any index for rentals */
  74.  
  75. rmfrentals   = open_rmf("rentalfile")
  76. say "rentalfile " any_err(rmfrentals)
  77.  
  78.  
  79. if loadfile = 1 then   /* create data/index files */
  80.    do
  81.    r = loaddata()
  82.    if r = 0 then /* file creation failed */      
  83.       do
  84.           if rmfvideos ~= '0000 0000'x then 
  85.              call close_rmf(videofile,1)
  86.           if rmfcustomers ~= '0000 0000'x then 
  87.              call close_rmf(rmfcustomers,1)
  88.           if rmfrentals ~= '0000 0000'x then 
  89.              call close_rmf(rmfrentals,1)
  90.           if exists('videofile') then 
  91.              delete 'videofile'
  92.           if exists('customerfile') then 
  93.              delete 'customerfile'
  94.           if exists('rentalfile') then 
  95.              delete 'rentalfile'
  96.           if exists('videofile.rmfindex') then 
  97.              delete 'videofile.rmfindex'
  98.           if exists('customerfile.rmfindex') then 
  99.              delete 'customerfile.rmfindex'
  100.           if exists('rentalfile.rmfindex') then 
  101.              delete 'rentalfile.rmfindex'
  102.           say "  ... BIG ERROR !!!  Unable to create data/index files  ... "
  103.           exit
  104.       end
  105.    end
  106.  
  107.  
  108. /* open a console, uncomment the open()  for whichever is required for you */
  109.  
  110. /* use this if running WShell/conman1.3   under ADOS 1.3 */
  111. /*  x = open(outwin,"CON:0/0/640/200//")   */
  112.  
  113.  
  114. /* use this if running WShell/conman1.3   under ADOS 2.04 */
  115. /*  x = open(outwin,"CON:0/0/640/200//r")   */
  116.  
  117.  
  118. /* use this if running WShell2.0/DisplayHandler  under ADOS 2.04  */
  119. x = open(outwin,"CON:0/0/640/200//SMART")
  120.  
  121.  
  122.  
  123. /* just some console escape sequences */
  124. eraseconsolescreen = '9b48 9b4a'x   
  125. offsetwrites = '9b39 3978'x
  126. offsettop = '9b39 3979'x  
  127. resettop = '9b79'x
  128. resetwrites = '9b78'x
  129. EOD = '9b4a'x
  130. EOL = '9b4b'x
  131. CURSORUP = '9b46'x
  132. CURSORDOWN = '9b45'x
  133.  
  134.  
  135.  
  136. /* --------- Our Menu --------- */
  137.  
  138. do forever 
  139.    zout = writech(outwin,rowcol(1,1)EOD)
  140.    zout = writeln(outwin,'0a'x copies(' ',16)color(2,1)"Your Get Rich Quick Video Rental Store" color(1,0) '0a'x)
  141.    zout = writeln(outwin,'0a'x copies(' ',28) color(1,0)"M  E  N  U"'0a'x'0a'x)
  142.    zout = writeln(outwin,'0a'x copies(' ',24) color(1,0)"1)." color(3,0)" Customer Inquiry")
  143.    zout = writeln(outwin,'0a'x copies(' ',24) color(1,0)"2)." color(3,0)" Video Inquiry")
  144.    zout = writeln(outwin,'0a'x copies(' ',24) color(1,0)"X)." color(3,0)" Enter" color(2,0)"X"color(3,0)" to exit")
  145.    zout = writeln(outwin,'0a'x'0a'x'0a'x)
  146.    zout = writech(outwin, copies(' ',23) color(1,0)"Enter Option 1 or 2 or X: ")
  147.    op = readln(outwin)
  148.    select 
  149.       when op = 1 then /* our CUSTOMER INQUIRY */
  150.         do
  151.            do forever
  152.               zout = writech(outwin,rowcol(1,1)EOD)
  153.               x = customerhistory() 
  154.               if x > 50 then leave
  155.            end
  156.         end
  157.       when op = 2 then /* our VIDEO INQUIRY */
  158.         do
  159.            zout = writech(outwin,rowcol(1,1)EOD)
  160.            vx = videohistory(0)
  161.            do forever
  162.               vx = videohistory(vx)
  163.               if vx > 99999 then leave
  164.               if vx = 0 then leave
  165.            end
  166.         end
  167.       when op = 'X' then leave
  168.       when op = 'x' then leave
  169.       otherwise nop
  170.    end
  171. end
  172.  
  173.  
  174. /* ---------- Save Files --------- */
  175.  
  176. call writech(outwin,rowcol(1,1)EOD)
  177. call writech(outwin,rowcol(12,32)color(2,1)"Saving Video Data"color(1,0))
  178. x = close_rmf(rmfvideos)
  179.  
  180. call writech(outwin,rowcol(1,1)EOD)
  181. call writech(outwin,rowcol(12,32)color(2,1)"Saving Customer Data"color(1,0))
  182. x = close_rmf(rmfcustomers)
  183.  
  184. call writech(outwin,rowcol(1,1)EOD)
  185. call writech(outwin,rowcol(12,32)color(2,1)"Saving Rental Data"color(1,0))
  186. x = close_rmf(rmfrentals)
  187.  
  188. x = close(outwin)
  189.  
  190. exit
  191.  
  192. /*-------------------------------------------------------------------------*
  193.  *-                                                                       -*
  194.  *-------------------------------------------------------------------------*/
  195. customerhistory:
  196.  
  197. zout = writech(outwin,'0a'x "Enter Customer Name or Number ?")
  198.  
  199. customer = readln(outwin)
  200.  
  201. customer = strip(customer)
  202.  
  203. if customer = '' then return 99
  204.  
  205. if datatype(customer) = 'NUM' then  /* entered a customer number */
  206.    do
  207.       l = length(customer)
  208.       if l > 4 then
  209.          do
  210.             zout = writeln(outwin,"Invalid customer number, must be 4digits or less")
  211.             return 0
  212.          end
  213.          
  214.       customer = (copies('0',(4-l)) || customer)  /* append leading zeros */
  215.    end
  216.       
  217. else          /* else if not numeric assume entered a customer last name */
  218.    customer = upper(customer)
  219.  
  220. /* READ THE CUSTOMER FILE */
  221. /* the primary index (0) indexes on customer number */
  222. /* the first alternate (1) indexes on customer last name */
  223.  
  224. if datatype(customer) = 'NUM' then  /* READ BY CUSTOMER NUMBER */
  225.  
  226.    x = read_rmf_record(rmfcustomers,0,customerrecord,customer,'K')
  227.  
  228. else /* READ BY CUSTOMER LAST NAME */
  229.  
  230.    x = read_rmf_record(rmfcustomers,1,customerrecord,customer,'K')
  231.  
  232.  
  233. if x = 0 then 
  234.    do
  235.       zout = writeln(outwin,'0a'x'0a'x"Customer:" customer "NOT FOUND")
  236.       zout = writech(outwin,'0a'x'0a'x"Press Return to Continue ...")
  237.       x = readln(outwin)
  238.       return 0
  239.    end      
  240.  
  241.    
  242. /* DISPLAY CUSTOMER RECORD */
  243.  
  244. zout = writeln(outwin,'0a'x color(3,0)"Cust#:" color(2,0)custnumber)
  245. zout = writeln(outwin,color(3,0)" Name :" color(2,0)custfirst custlast )
  246. zout = writeln(outwin,color(3,0)" Addrs:" color(2,0)custaddr )
  247. zout = writeln(outwin,color(3,0)" City :" color(2,0)custcity custstate custzip )
  248. zout = writeln(outwin,color(3,0)" Phone:" color(2,0)'('custareacode')' custphone )
  249.       
  250. zout = writeln(outwin,rowcol(5,40)color(3,0)"Deposit On File:" color(2,0)custdeposit )
  251. zout = writeln(outwin,rowcol(6,40)color(3,0)"Balance Due:" color(2,0)custbalance)
  252. zout = writeln(outwin,rowcol(9,1))
  253. zout = writech(outwin,offsetwrites)
  254. zout = writeln(outwin,color(2,1)"Film# CP  Rented       Title"copies(' ',23)"Rating"color(1,0))
  255.  
  256. zout = writech(outwin,null())
  257. zout = writech(outwin,offsettop)
  258.  
  259.  
  260. /* READ THE RENTAL FILE FOR THIS CUSTOMER */
  261.  
  262. x = read_rmf_record(rmfrentals,1,rentalrecord,custnumber,'K')
  263.  
  264. if x = 0 then zout = writeln(outwin, "No rental records found")
  265.  
  266. displayed = 0
  267.  
  268. do while x = 1  /* the NEXT_RMF_RECORD below will set x to zero */
  269.  
  270.    /* READ THE VIDEO FILE TO GET VIDEO INFO */
  271.    y = read_rmf_record(rmfvideos,0,videorecord,rentalvideonum,'K')
  272.    if y = 1 then 
  273.       do
  274.          title = substr(videotitle,1,32," ")
  275.          zout = writeln(outwin, rentalvideonum rentalvideocopy rentaldate title videorating)
  276.          displayed = displayed + 1
  277.       end
  278.    if displayed = 9 then 
  279.       do   
  280.          x = writech(outwin,'0a'x'0a'x"Press Return to Continue ...")
  281.          x = readln(outwin)
  282.          x = writech(outwin,'9b46 9b4b'x) /* move up and erase line */
  283.          x = writech(outwin,'9b46'x)      /* to effect scrolling    */
  284.          x = writech(outwin,'9b46'x)
  285.          displayed = 0
  286.       end
  287.       
  288.    /* get the next rental record for this customer */
  289.    x = next_rmf_record(rmfrentals,1,rentalrecord)   
  290.  
  291. end
  292.  
  293. x = writech(outwin,'0a'x"**** **** End of List **** ****")
  294. x = writech(outwin,'0a'x'0a'x"Press Return to Continue ...")
  295. x = readln(outwin)
  296. zout = writech(outwin,resetwrites)
  297. zout = writech(outwin,resettop)
  298. return 1
  299.  
  300. /*-------------------------------------------------------------------------*
  301.  *-                                                                       -*
  302.  *-------------------------------------------------------------------------*/
  303. videohistory:
  304.  
  305. parse arg vidnumber
  306.  
  307. if vidnumber = 0 then 
  308.    do
  309.       /* GET LIST OF VIDEO NUMBERS */
  310.       vidnode = find_pos(rmfvideos,0,1)    /* find first record in index     */
  311.  
  312.       zout = writech(outwin,copies(' ',29) color(2,1)"Video Numbers" color(1,0) '0a'x "  ")
  313.  
  314.       displayed = 0
  315.       linecnt   = 0
  316.       do while vidnode ~= '0000 0000'x /* vidnode is a POINTER to node in the tree */
  317.  
  318.          thevideonumberis =  "   " || key_value(vidnode)
  319.  
  320.          zout = writech(outwin,(color(2,1) || thevideonumberis || color(1,0)) )
  321.  
  322.          displayed = displayed + 1
  323.  
  324.          if displayed > 7 then
  325.             do
  326.                displayed = 0
  327.                zout = writech(outwin,(color(2,1) || "  " || '0a'x || color(1,0) || "   ") )
  328.                linecnt = linecnt + 1
  329.                if linecnt > 8 then leave
  330.             end
  331.  
  332.          vidnode = next_unique(rmfvideos,0)  /* low-level functions dont do any I/O */
  333.  
  334.       end
  335.  
  336.       vidnumber = get_a_video_number()
  337.       
  338. end  /* if vidnumber = 0 */
  339. zout = writech(outwin,color(1,0))
  340.  
  341.  
  342.  
  343. if vidnumber > 99999 then return 999999
  344. if vidnumber = 0 then return 999999
  345.  
  346. /* READ THE VIDEO FILE TO GET VIDEO INFO */
  347.  
  348. do forever
  349.    x = read_rmf_record(rmfvideos,0,videorecord,vidnumber,'K')
  350.    
  351.    if x = 1 then leave  /* found video in file */
  352.    
  353.    zout = writeln(outwin,rowcol(12,1)"Video Number:" vidnumber "NOT FOUND")
  354.    zout = writech(outwin, rowcol(21,1))
  355.    zout = writech(outwin,"Press Return to Continue ...")
  356.    zin  = readln(outwin)
  357.    
  358.    vidnumber = get_a_video_number()
  359.    
  360.    if vidnumber > 99999 then return 999999
  361.    if vidnumber = 0 then return 999999
  362.    
  363. end
  364.  
  365. currentcust = ''   
  366. currenthold = ''
  367.  
  368. videocust = random(1,100) /* generate a customer number */
  369.  
  370. if videocust > 0 then /* READ CUSTOMER FILE FOR CURRENT RENTER */
  371.    do
  372.       videocust = copies('0',(4-length(videocust))) || videocust
  373.       custfound = read_rmf_record(rmfcustomers,0,customerrecord,videocust,'K')
  374.       if custfound then
  375.          currentcust = custfirst custlast
  376.       else
  377.          videocust = '0000'
  378.    end   
  379.  
  380. videohold = random(1,100) /* generate a customer number */
  381. if videohold = videocust then
  382.    videohold = 0
  383.  
  384. if videohold > 0 then /* READ CUSTOMER FILE FOR, HOLD FOR CUSTOMER */
  385.    do
  386.       videohold = copies('0',(4-length(videohold))) || videohold
  387.       holdfound = read_rmf_record(rmfcustomers,0,customerrecord,videohold,'K')
  388.       if holdfound then 
  389.          currenthold = custfirst custlast
  390.       else
  391.          videohold = '0000'
  392.    end   
  393.  
  394. /* HOW MANY COPIES WE GOT */
  395. count = key_count(rmfvideos,0,vidnumber,'K')
  396.  
  397. zout = writeln(outwin,rowcol(12,1)" Video#:" videonum " Number of copies:" count)
  398. title = substr(videotitle,1,32,' ')
  399. zout = writech(outwin,color(3,0)" Title           :")
  400. zout = writeln(outwin,color(2,0)title color(3,0) "Copy#:" color(2,0)videocopy color(3,0)"Rating:" color(2,0)videorating)
  401. zout = writeln(outwin,color(3,0)"   Date Purchased:"color(2,0)videopudate)
  402. zout = writeln(outwin,color(3,0)"   Purchase Price:"color(2,0)videopuprice)
  403. zout = writeln(outwin,color(3,0)"   Sale Price    :"color(2,0)videosaleprice)
  404. zout = writeln(outwin,color(3,0)"   Available     :"color(2,0)videoavail)
  405. zout = writeln(outwin,color(3,0)"   Hold For      :"color(2,0)videohold color(3,0)"    Name:" color(2,0)currenthold)
  406. zout = writeln(outwin,color(3,0)"   Current Renter:"color(2,0)videocust color(3,0)"    Name:" color(2,0)currentcust)
  407.    
  408. zout = writech(outwin, rowcol(21,1))
  409. x = writech(outwin, color(1,0) "Press Return to Continue ...")
  410. x = readln(outwin)
  411.  
  412. return get_a_video_number()
  413.  
  414.  
  415.  
  416.  
  417. /*-------------------------------------------------------------------------*
  418.  *-                                                                       -*
  419.  *-------------------------------------------------------------------------*/
  420.  
  421. get_a_video_number:
  422.  
  423. do forever
  424.    zout = writech(outwin,rowcol(12,1)EOD)
  425.    zout = writech(outwin,rowcol(21,1) color(1,0)"Enter Video Number ?")
  426.    vidn = readln(outwin)
  427.    if vidn = '' then leave
  428.    if datatype(vidnumber) = 'NUM' then
  429.       do
  430.          vl = length(vidn)
  431.          if vl > 5 then
  432.             do
  433.                zout = writech(outwin, color(1,0) rowcol(12,1) EOD)
  434.                zout = writeln(outwin,"Invalid Video Number, must be 5digits or less")
  435.                zout = writech(outwin, rowcol(21,1))
  436.                zout = writech(outwin,"Press Return to Continue ...")
  437.                zin  = readln(outwin)
  438.             end
  439.  
  440.          vidn = (copies('0',(5-vl)) || vidn) /* append leading zeros */
  441.          if vidn = '00000' then return 999999
  442.          return vidn
  443.       end
  444.    else 
  445.       do
  446.          zout = writeln(outwin,"Invalid Video Number, must be Numeric")
  447.          zout = writech(outwin, rowcol(21,1))
  448.          zout = writech(outwin,"Press Return to Continue ...")
  449.          zin  = readln(outwin)
  450.       end
  451. end
  452.  
  453. return 999999
  454.  
  455.  
  456. /*-------------------------------------------------------------------------*
  457.  *-                                                                       -*
  458.  *-------------------------------------------------------------------------*/
  459.  rowcol:
  460.  parse arg row,col
  461.  outb = '9b'x || row || ';' || col || 'H'
  462.  return outb
  463.  
  464. /*-------------------------------------------------------------------------*
  465.  *-                                                                       -*
  466.  *-------------------------------------------------------------------------*/
  467.  color:
  468.  parse arg fg,bg
  469.  outb = '9b'x || '0;3' || fg || ';4' || bg || 'm'
  470.  return outb
  471.  
  472.  
  473.  
  474. /*-------------------------------------------------------------------------*
  475.  *-                                                                       -*
  476.  *- Load RMF files with data                                              -*
  477.  *- This is only called when the rmf files do not exists                  -*
  478.  *-                                                                       -*
  479.  *-------------------------------------------------------------------------*/
  480.  
  481. loaddata:
  482.  
  483.  
  484. x = open(viddata,"viddata",'R')
  485. if x = 0 then 
  486.    do 
  487.       zout = writeln(outwin, "could not open video data file")
  488.       return 0
  489.    end
  490.    
  491. x = open(rentdata,"rentdata",'R')
  492. if x = 0 then
  493.    do 
  494.       zout = writeln(outwin, "could not open rental data file")
  495.       return 0
  496.    end
  497.    
  498. x = open(custdata,"custdata",'R')
  499. if x = 0 then
  500.    do 
  501.       zout = writeln(outwin, "could not open customer data file")
  502.       return 0
  503.    end
  504.  
  505. /* LOAD CUSTOMER DATA */
  506. do forever
  507.    cdata = readln(custdata)
  508.    if eof(custdata) = 1 then leave
  509.    if substr(cdata,1,1) = '#' then iterate
  510.    parse var cdata custnumber ',' custfirst ',' custlast ',' custaddr ',' ,
  511.                    custcity ',' custstate ',' custzip ',' custphone ',' , 
  512.                    custareacode ',' custdeposit ',' custbalance
  513.    
  514.    lastname = upper(custlast)
  515.    
  516.    if custbalance > 0 then
  517.       x = write_rmf_record(rmfcustomers,customerrecord,custnumber,1,lastname)
  518.    else
  519.       x = write_rmf_record(rmfcustomers,customerrecord,custnumber,1,lastname,2,custbalance)
  520.    
  521.    if x = 0 then 
  522.       do   
  523.          say "Write Failed " any_err(rmfcustomers)
  524.          say custfirst custlast custnumber
  525.       end
  526. end
  527.  
  528. /* LOAD VIDEO DATA */
  529. do forever
  530.    vdata = readln(viddata)
  531.    if eof(viddata) = 1 then leave
  532.    if substr(vdata,1,1) = '#' then iterate
  533.    parse var vdata videonum ',' videotitle ',' videocopy ',' videorating ',' ,
  534.                    videopudate ',' videopuprice ',' videosaleprice ',' ,
  535.                    videoavail ',' videohold ',' videocust
  536.                    
  537.    filmcopy = strip((videonum || videocopy))
  538.    
  539.    if videoavail = 'Y' then
  540.       x = write_rmf_record(rmfvideos,videorecord,videonum,1,videorating,4,filmcopy)
  541.    else
  542.    if videohold > 0 then  /* hold video for this customer */
  543.       x = write_rmf_record(rmfvideos,videorecord,videonum,1,videorating,2,videohold,4,filmcopy)
  544.    else
  545.       if videocust > 0 then /* this customer has it */
  546.          x = write_rmf_record(rmfvideos,videorecord,videonum,1,videorating,3,videocust,4,filmcopy)
  547.    
  548.    if x = 0 then 
  549.       do
  550.          say "Write failed" any_err(rmfvideos)
  551.          say videonum videocopy
  552.       end
  553. end
  554.  
  555. /* LOAD RENTAL DATA */
  556. do forever
  557.    rdata = readln(rentdata)
  558.    if eof(rentdata) = 1 then leave
  559.    if substr(rdata,1,1) = '#' then iterate
  560.    parse var rdata rentalcustnumber ',' rentalvideonum ',' rentalvideocopy ',' rentaldate
  561.    filmcopy = strip( (rentalvideonum || rentalvideocopy) )
  562.    x = write_rmf_record(rmfrentals,rentalrecord,rentalvideonum,1,rentalcustnumber,2,rentaldate,3,filmcopy)
  563. end
  564.  
  565. x = close(viddata)
  566. x = close(rentdata)
  567. x = close(custdata)
  568.  
  569. return 1
  570.  
  571.